package com.base.demo.design.play;

import com.alibaba.fastjson.JSON;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description: hashMap测试
 * @BelongsProject: base-demo-design
 * @BelongsPackage: com.base.demo.design.play
 * @Author: ChenYongJia
 * @CreateTime: 2021-08-12 14:15
 * @Email: chen87647213@163.com
 * @Version: 1.0
 */
public class HashMapTest {

    public static void main(String[] args) {
        // 初始化字符串集合7个
        List<String> list = new ArrayList<>();
        list.add("SUNNY");
        list.add("CHEN");
        list.add("WANG");
        list.add("MENG");
        list.add("XIA");
        list.add("小傅哥");
        list.add("小佳佳");

        // 定义一个数组用于存放字符串，注意这里的长度是8，也就是2的倍数。定义一个数组用于存放字符串，注意这里的长度是8，也就是2的倍数。
        String[] tab = new String[8];

        /**
         * 循环存入
         *
         * 今天使用lambda表达式处理集合时，发现对return、break以及continue的使用有点迷惑，于是自己动手测试了一下，
         *
         * 才发现在使用foreach()处理集合时不能使用break和continue这两个方法，也就是说不能按照普通的for循环遍历集合时那样根据条件来中止遍历，
         *
         * 而如果要实现在普通for循环中的效果时，可以使用return来达到，也就是说如果你在一个方法的lambda表达式中使用return时，
         *
         * 这个方法是不会返回的，而只是执行下一次遍历，看如下的测试代码：
         *
         * 可以看出return起到的作用和continue是相同的。
         *
         * foreach()不是一个循环，不是设计为可以用break以及continue来中止的操作。
         * https://stackoverflow.com/questions/23996454/terminate-or-break-java-8-stream-loop
         */
        list.stream().forEach(item -> {
            // 计算索引的位置
            int idx = item.hashCode() & (tab.length - 1);
            System.out.println(String.format("item的值=%s Idx=%d", item, idx));
            if (tab[idx] == null) {
                tab[idx] = item;
                // Stream.forEach 是一个循环。不同之处在于它是一个内部循环，而不是一个外部循环。因为循环是内部的，所以你不能在它上面调用 break和continue。
                return;
            }
            tab[idx] = tab[idx] + "->" + item;
        });

        /**
         * 接下来就是循环存放数据，计算出每个字符串在数组中的位置。-key.hashCode() & (tab.length - 1)
         */
        /*for(String item : list){
            // 计算索引的位置
            int idx = item.hashCode() & (tab.length - 1);
            System.out.println(String.format("item的值=%s Idx=%d", item, idx));
            // 在字符串存放到数组的过程，如果遇到相同的元素，进行连接操作模拟链表的过程。
            if (tab[idx] == null){
                tab[idx] = item;
                continue;
            }
            tab[idx] = tab[idx] + "->" + item;
        }*/

        // 最后输出存放结果。
        System.out.println(JSON.toJSONString(tab));

    }

}
